PythonããŒã¹ã®çšéèšç®ãšã³ãžã³ãæ§ç¯ããã°ããŒãã«ãªçšåèŠå¶ãžã®æºæ ã確ä¿ããæ¹æ³ãåŠã³ãŸããèšèšååãå®è£ æŠç¥ãããã³ãã¹ããã©ã¯ãã£ã¹ãæ¢æ±ããŸãã
Pythonã®çšéèšç®ïŒå ç¢ãªã³ã³ãã©ã€ã¢ã³ã¹ã«ãŒã«ãšã³ãžã³ã®æ§ç¯
仿¥ã®ã°ããŒãã«çµæžã«ãããŠãäŒæ¥ã¯è€éãªåœéçšåèŠå¶ãä¹ãè¶ãããšããå°é£ãªèª²é¡ã«çŽé¢ããŠããŸããçšéèšç®ã®èªååã¯ãã¯ãèŽ æ²¢åã§ã¯ãªããå¹çæ§ãæ£ç¢ºæ§ãããã³ã³ã³ãã©ã€ã¢ã³ã¹ã®ããã«å¿ èŠäžå¯æ¬ ãªãã®ã§ããPythonã¯ãã®å€æ§æ§ãšè±å¯ãªã©ã€ãã©ãªã«ãããå ç¢ã§é©å¿æ§ã®é«ãçšéèšç®ãšã³ãžã³ãæ§ç¯ããããã®åªãããã©ãããã©ãŒã ãæäŸããŸãããã®èšäºã§ã¯ããã®ãããªãšã³ãžã³ãäœæããäžã§éèŠãªèæ ®äºé ãšå®è·µçãªã¹ããããæ¢ããŸãã
çšéèšç®ã«Pythonãéžã¶çç±
Pythonã¯çšéèšç®ã·ã¹ãã ãéçºããäžã§ããã€ãã®å©ç¹ãæäŸããŸãã
- å¯èªæ§ãšä¿å®æ§ïŒPythonã®æç¢ºãªæ§æã¯ãã³ãŒããçè§£ããããä¿å®ããããããŸããããã¯é·æãããžã§ã¯ãã«ãšã£ãŠéèŠã§ãã
- è±å¯ãªã©ã€ãã©ãªïŒããŒã¿æäœã®ããã®
pandasãæ°å€èšç®ã®ããã®NumPyããããŠã«ãŒã«ãšã³ãžã³ãªã©ã®ã©ã€ãã©ãªã¯ãçšåããžãã¯ã®å®è£ ã«åŒ·åãªããŒã«ãæäŸããŸãã - æè»æ§ãšã¹ã±ãŒã©ããªãã£ïŒPythonã¯ããŸããŸãªããŒã¿åœ¢åŒãåŠçããä»ã®ã·ã¹ãã ãšã·ãŒã ã¬ã¹ã«çµ±åã§ãããããããžãã¹ã®æé·ã«åãããŠã¹ã±ãŒã©ããªãã£ã確ä¿ã§ããŸãã
- ã¯ãã¹ãã©ãããã©ãŒã äºææ§ïŒPythonã¯ããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§åäœãããããçšåãšã³ãžã³ãç°ãªãç°å¢ã«å±éã§ããŸãã
- ãªãŒãã³ãœãŒã¹ãšã³ã¹ãå¹çïŒPythonã¯ç¡æã§å©çšã§ãããããéçºã³ã¹ããåæžã§ããŸãã
çšåã³ã³ãã©ã€ã¢ã³ã¹ã«ãŒã«ãšã³ãžã³ã®èšèš
çšéèšç®ã·ã¹ãã ã®æ žãšãªãã®ã¯ã«ãŒã«ãšã³ãžã³ã§ããé©åã«èšèšãããã«ãŒã«ãšã³ãžã³ã¯ã以äžã®æ¡ä»¶ãæºããã¹ãã§ãã
- æè»æ§ïŒå€åããçšæ³ãèŠå¶ã«å¯Ÿå¿ã§ããããšã
- ä¿å®æ§ïŒéçºè ãçšåå°éå®¶ã容æã«çè§£ããä¿®æ£ã§ããããšã
- ã¹ã±ãŒã©ããªãã£ïŒå¢å€§ããããŒã¿éãšèšç®ãåŠçã§ããããšã
- ãã¹ãå¯èœæ§ïŒæ£ç¢ºæ§ãšã³ã³ãã©ã€ã¢ã³ã¹ã確ä¿ããããã®åŸ¹åºçãªãã¹ãã容æã«ããããšã
- éææ§ïŒçšéèšç®ãã©ã®ããã«å®è¡ããããã«ã€ããŠæç¢ºãªèª¬æãæäŸããããšã
çšåã«ãŒã«ãšã³ãžã³ã®äž»èŠã³ã³ããŒãã³ã
å žåçãªçšåã«ãŒã«ãšã³ãžã³ã¯ã以äžã®ã³ã³ããŒãã³ãã§æ§æãããŸãã
- ããŒã¿å ¥åïŒå£²äžãè³Œå ¥ãåŸæ¥å¡å ±é ¬ãªã©ãååŒã«é¢é£ããçããŒã¿ãåŠçããŸãã
- ã«ãŒã«ãªããžããªïŒç°ãªã管èœåºåã®çšåã«ãŒã«ãçšçãéŸå€ãä¿åããŸãã
- ã«ãŒã«ãšã³ãžã³ã³ã¢ïŒå ¥åããŒã¿ãšã«ãŒã«ãªããžããªã«åºã¥ããŠã«ãŒã«ãå®è¡ããŸãã
- èšç®ããžãã¯ïŒçšéãèšç®ããããã«å¿ èŠãªæ°åŠçæŒç®ãå®è¡ããŸãã
- ã¬ããŒããšç£æ»èšŒè·¡ïŒã¬ããŒããçæãããã¹ãŠã®èšç®ã®ç£æ»èšŒè·¡ãä¿æããŸãã
Pythonã«ããå®è£ æŠç¥
PythonããŒã¹ã®çšéèšç®ãšã³ãžã³ãå®è£ ããããã®å®çšçãªã¢ãããŒãã以äžã«ç€ºããŸãã
1. ããŒã¿ã¢ããªã³ã°
ãŸããããžãã¹ååŒã衚ãããŒã¿æ§é ãå®çŸ©ããŸããPythonã®ã¯ã©ã¹ãèŸæžã䜿çšããŠã以äžã®ãããªäž»èŠãªãšã³ãã£ãã£ãã¢ãã«åããŸãã
- ååŒïŒæ¥ä»ãéé¡ã補å/ãµãŒãã¹ãå Žæãªã©ã®è©³çްãå«ã¿ãŸãã
- 補å/ãµãŒãã¹ïŒç°ãªãçšçãé©çšããããã®åé¡ã
- 顧客/ãã³ããŒïŒå Žæãšçšåç»é²æ å ±ã
äŸïŒ
class Transaction:
def __init__(self, date, amount, product_id, customer_id, location):
self.date = date
self.amount = amount
self.product_id = product_id
self.customer_id = customer_id
self.location = location
2. ã«ãŒã«è¡šçŸ
çšåã«ãŒã«ããã«ãŒã«ãšã³ãžã³ã容æã«è§£éã§ããæ§é åããã圢åŒã§è¡šçŸããŸãããªãã·ã§ã³ã«ã¯ä»¥äžãå«ãŸããŸãã
- JSONïŒçšçãéŸå€ãæ¡ä»¶ãä¿åããã®ã«é©ãã人éãèªãã圢åŒã
- YAMLïŒèšå®ãã¡ã€ã«ã«ãã䜿çšãããå¥ã®èªã¿ããã圢åŒã
- PythonèŸæžïŒããåçŽãªã«ãŒã«ã»ããã«é©ããŠããŸãã
- å°çšã®ã«ãŒã«ãšã³ãžã³ã©ã€ãã©ãªïŒ
Rule EngineïŒäžèšåç §ïŒãªã©ã®ã©ã€ãã©ãªã¯ãè€éãªã«ãŒã«ã管çããããã®ããé«åºŠãªæ©èœãæäŸããŸãã
äŸïŒJSONïŒïŒ
{
"tax_rules": [
{
"jurisdiction": "US-CA",
"product_category": "Electronics",
"tax_rate": 0.0725,
"conditions": {
"amount": {
"greater_than": 100
}
}
},
{
"jurisdiction": "EU-DE",
"product_category": "Books",
"tax_rate": 0.19,
"conditions": {}
}
]
}
3. ã«ãŒã«ãšã³ãžã³ã®å®è£
ã«ãŒã«ãšã³ãžã³ã¯ãæç¶ãåã¢ãããŒãã䜿çšããããæ¢åã®Pythonã©ã€ãã©ãªã掻çšããŠå®è£ ã§ããŸãã
a) æç¶ãåã¢ãããŒã
ããã¯ãã«ãŒã«ãå埩åŠçããå ¥åããŒã¿ã«åºã¥ããŠé©çšããPythonã³ãŒããèšè¿°ããããšã䌎ããŸãããã®ã¢ãããŒãã¯ããå€ãã®å¶åŸ¡ãæäŸããŸãããå€§èŠæš¡ãªã«ãŒã«ã»ããã§ã¯è€éã«ãªãå¯èœæ§ããããŸãã
def calculate_tax(transaction, rules):
for rule in rules:
if rule['jurisdiction'] == transaction.location and \\
rule['product_category'] == get_product_category(transaction.product_id):
if 'conditions' in rule:
if 'amount' in rule['conditions'] and \\
'greater_than' in rule['conditions']['amount']:
if transaction.amount > rule['conditions']['amount']['greater_than']:
return transaction.amount * rule['tax_rate']
else:
return transaction.amount * rule['tax_rate'] # No amount condition
else:
return transaction.amount * rule['tax_rate'] # No conditions
return 0 # No applicable rule found
b) ã«ãŒã«ãšã³ãžã³ã©ã€ãã©ãªã®äœ¿çšïŒäŸïŒRule EngineïŒ
Rule Engineã©ã€ãã©ãªã¯ãã«ãŒã«ãå®çŸ©ãå®è¡ããããã®ããæ§é åãããæ¹æ³ãæäŸããŸããããã«ãããã·ã³ãã«ãªæ§æã䜿çšããŠã«ãŒã«ãå®çŸ©ããããŒã¿ã«å¯ŸããŠèªåçã«è©äŸ¡ããããšãã§ããŸãã
ãŸããã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã
pip install rule-engine
次ã«ãã«ãŒã«ãå®çŸ©ããŸãã
from rule_engine import Rule, Engine, Context
# Define a context with functions to access data
def get_product_category(product_id):
# Placeholder for looking up product category
# In a real implementation, this would query a database or API
if product_id.startswith('E'):
return 'Electronics'
elif product_id.startswith('B'):
return 'Books'
else:
return 'Other'
context = Context(functions={
'get_product_category': get_product_category
})
engine = Engine(context=context)
# Create rules
rule1 = Rule("location == 'US-CA' and get_product_category(product_id) == 'Electronics' and amount > 100", engine=engine)
rule2 = Rule("location == 'EU-DE' and get_product_category(product_id) == 'Books'", engine=engine)
# Transaction data
transaction1 = {'location': 'US-CA', 'product_id': 'E123', 'amount': 150}
transaction2 = {'location': 'EU-DE', 'product_id': 'B456', 'amount': 50}
# Evaluate rules
if rule1.matches(transaction1):
tax1 = transaction1['amount'] * 0.0725
print(f"Tax for transaction 1: {tax1}")
elif rule2.matches(transaction2):
tax2 = transaction2['amount'] * 0.19
print(f"Tax for transaction 2: {tax2}")
else:
print("No applicable rule found.")
4. èšç®ããžãã¯
ã«ãŒã«ã«åºã¥ããŠçšéèšç®ããžãã¯ãå®è£ ããŸããããã«ã¯ä»¥äžãå«ãŸããå ŽåããããŸãã
- çšçã®é©çšã
- 課çšé¡ã®èšç®ã
- æ§é€ãšå é€ã®é©çšã
- ç°ãªãçšå¶ïŒäŸïŒVATãGSTã売äžçšïŒã®åŠçã
5. ããŒã¿ã¹ãã¬ãŒãžãšååŸ
çšåã«ãŒã«ãååŒããŒã¿ãèšç®çµæãä¿åããããã®é©åãªããŒã¿ã¹ãã¬ãŒãžãœãªã¥ãŒã·ã§ã³ãéžæããŸãããªãã·ã§ã³ã«ã¯ä»¥äžãå«ãŸããŸãã
- ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ïŒäŸïŒPostgreSQLãMySQLïŒïŒæ§é åããŒã¿ãè€éãªã¯ãšãªã«æé©ã§ãã
- NoSQLããŒã¿ããŒã¹ïŒäŸïŒMongoDBïŒïŒéæ§é åããŒã¿ãæè»ãªã¹ããŒãã«é©ããŠããŸãã
- ã¯ã©ãŠãã¹ãã¬ãŒãžïŒäŸïŒAWS S3ãGoogle Cloud StorageïŒïŒå€§éã®ããŒã¿ãä¿åããããã
6. ãã¹ããšæ€èšŒ
æ£ç¢ºæ§ãšã³ã³ãã©ã€ã¢ã³ã¹ã確ä¿ããããã«ãçšéèšç®ãšã³ãžã³ã培åºçã«ãã¹ãããŸããããã«ã¯ä»¥äžãå«ãŸããŸãã
- åäœãã¹ãïŒåã ã®é¢æ°ãšã¢ãžã¥ãŒã«ã®æ£ç¢ºæ§ãæ€èšŒããŸãã
- çµ±åãã¹ãïŒã·ã¹ãã ã®ç°ãªãã³ã³ããŒãã³ãéã®çžäºäœçšããã¹ãããŸãã
- ãšã³ãããŒãšã³ããã¹ãïŒå®éã®ã·ããªãªãã·ãã¥ã¬ãŒãããã·ã¹ãã ãæåããæåŸãŸã§æ£ããæ©èœããããšã確èªããŸãã
- ååž°ãã¹ãïŒå€æŽãå ããåŸã«ãã¹ããåå®è¡ããæ°ããåé¡ãå°å ¥ãããŠããªãããšã確èªããŸãã
- ã³ã³ãã©ã€ã¢ã³ã¹ç£æ»ïŒã·ã¹ãã ãçŸåšã®çšåèŠå¶ã«æºæ ããŠããããšã宿çã«ã¬ãã¥ãŒããŸãã
ãã¹ãã®äœæãšå®è¡ã«ã¯ãPythonã®unittestãŸãã¯pytestãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸããã³ã³ããŒãã³ããåé¢ããããŸããŸãªã·ããªãªãã·ãã¥ã¬ãŒãããããã«ãã¢ãã¯ã©ã€ãã©ãªã®äœ¿çšãæ€èšããŠãã ããã
7. ã¬ããŒããšç£æ»èšŒè·¡
ç°ãªã管èœåºååãã®çšåã¬ããŒããçæããããã®ã¬ããŒãæ©èœã®å®è£ ããã¹ãŠã®èšç®ã®ç£æ»èšŒè·¡ãä¿æããŸããããã«ã¯ä»¥äžãå«ãŸããŸãã
- å ¥åããŒã¿
- é©çšãããã«ãŒã«
- èšç®ã¹ããã
- åºåçµæ
ãã®ç£æ»èšŒè·¡ã¯ãã³ã³ãã©ã€ã¢ã³ã¹ãå®èšŒããäžäžèŽã解決ããããã«äžå¯æ¬ ã§ãã
åœéçšåã®èæ ®äºé
ã°ããŒãã«ãªèŠèŽè åãã«çšéèšç®ãšã³ãžã³ãæ§ç¯ããéã«ã¯ã以äžã®åœéçšåã®èæ ®äºé ãæ€èšããŠãã ããã
- ä»å 䟡å€çšïŒVATïŒïŒãµãã©ã€ãã§ãŒã³ã®å段éã§ä»å ããã䟡å€ã«å¯ŸããŠèª²ãããæ¶è²»çšã§ããEU諞åœããã®ä»ã®å°åã§ã¯ãVATçšçãšã«ãŒã«ã倧ããç°ãªããŸãã
- ç©åãµãŒãã¹çšïŒGSTïŒïŒVATãšåæ§ã«ããªãŒã¹ãã©ãªã¢ãã«ãããã€ã³ããªã©ã®åœã§æ¡çšãããŠããŸããå管èœåºåã®ç¹å®ã®GSTèŠå¶ãçè§£ããããšãéèŠã§ãã
- 売äžçšïŒç±³åœã§äžè¬çã§ãããæ¶è²»è ã«è²©å£²ãããååããµãŒãã¹ã«å¯ŸããŠæçµå£²äžæã«èª²ãããçšéã§ãã売äžçšçã¯å·ã«ãã£ãŠãå Žåã«ãã£ãŠã¯åžãé¡ã«ãã£ãŠãç°ãªããŸãã
- æºæ³åŸŽåçšïŒé åœã婿¯ããã€ã€ã«ãã£ãªã©ãéå± äœè ãžã®æ¯æãããæºæ³åŸŽåãããçšéã§ããåœéã®ç§çšæ¡çŽã¯æºæ³åŸŽåçšçã«åœ±é¿ãäžããããšããããŸãã
- ç§»è»¢äŸ¡æ Œçšå¶ïŒç°ãªãåœã®é¢é£äŒç€Ÿéã®ååŒäŸ¡æ ŒãèŠå¶ããã«ãŒã«ã§ãããããã®ã«ãŒã«ã¯ãç§çšåé¿ãé²ãããã«èšèšãããŠããŸãã
- æä¹ çæœèšïŒPEïŒïŒäŒæ¥ãå€åœã§èª²çšå¯Ÿè±¡ãšãªãäºæ¥æŽ»åãè¡ã£ãŠãããã©ããã倿ããããšã
- ããžã¿ã«ãµãŒãã¹çšïŒDSTïŒïŒç¹å®ã®åœã®ãŠãŒã¶ãŒã«æäŸãããããžã¿ã«ãµãŒãã¹ããçããåçã«å¯Ÿããçšéã
äŸãã°ãç°ãªãåœã®é¡§å®¢ã«ãªã³ã©ã€ã³ã§ãœãããŠã§ã¢ã販売ããäŒæ¥ã¯ãVAT/GSTã®ç»é²éŸå€ãå ±åèŠä»¶ãããã³å管èœåºåã«é©çšãããçšçãèæ ®ããå¿ èŠããããŸããå Žåã«ãã£ãŠã¯ãB2BååŒã«ãªããŒã¹ãã£ãŒãžã¡ã«ããºã ã䜿çšããå¿ èŠããããããããŸããã
æºæ ããçšåãšã³ãžã³ãæ§ç¯ããããã®ãã¹ããã©ã¯ãã£ã¹
- åžžã«ææ°æ å ±ãå ¥æããïŒçšæ³ããã³èŠå¶ã¯åžžã«å€åããŠããŸãããããã®å€æŽãåæ ããããã«ãã«ãŒã«ãšã³ãžã³ã®ç£èŠãšæŽæ°ã®ããã»ã¹ãå®è£ ããŠãã ããã
- çšåå°éå®¶ãšåè°ããïŒçšåå°éå®¶ãšé£æºãããšã³ãžã³ãçŸåšã®èŠå¶ãšãã¹ããã©ã¯ãã£ã¹ãæ£ç¢ºã«åæ ããŠããããšã確èªããŠãã ããã
- å ç¢ãªã»ãã¥ãªãã£å¯Ÿçãå®è£ ããïŒæ©å¯æ§ã®é«ãçšåããŒã¿ãäžæ£ã¢ã¯ã»ã¹ã䟵害ããä¿è·ããŸãã
- ããŒãžã§ã³ç®¡çã䜿çšããïŒã«ãŒã«ãšã³ãžã³ã®ã³ãŒããšæ§æãžã®å€æŽã远跡ããç£æ»ãšãããã°ã容æã«ããŸãã
- ãããã€ãèªååããïŒã«ãŒã«ãšã³ãžã³ãžã®æŽæ°ã®ãããã€ããã»ã¹ãèªååãããšã©ãŒãšããŠã³ã¿ã€ã ãæå°éã«æããŸãã
- ããã©ãŒãã³ã¹ãç£èŠããïŒã«ãŒã«ãšã³ãžã³ã®ããã©ãŒãã³ã¹ãç£èŠããããã«ããã¯ãç¹å®ããŠå¯ŸåŠããŸãã
- ãã¹ãŠãææžåããïŒçšåãšã³ãžã³ã®èšèšãå®è£ ããã¹ããææžåããä¿å®ãšç¥èå ±æã容æã«ããŸãã
- ã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ã掻çšããïŒçšåãšã³ãžã³ã®éçºãšä¿å®ãç°¡çŽ åããããã«ãã¯ã©ãŠãããŒã¹ã®çšåã³ã³ãã©ã€ã¢ã³ã¹ãã©ãããã©ãŒã ã®æŽ»çšãæ€èšããŠãã ããã
äŸïŒæ¬§å·é£åã«ãããVATã®åŠç
欧å·é£åã®é¡§å®¢ã«ããžã¿ã«è£œåã販売ããããžãã¹ãèããŠã¿ãŸããããé¡§å®¢ã®æåšå°ã«åºã¥ããŠVATãèšäžããå¿ èŠããããŸããç°¡ç¥åãããäŸã¯æ¬¡ã®ãšããã§ãã
- é¡§å®¢ã®æåšå°ãç¹å®ããïŒIPã¢ãã¬ã¹ã®ãžãªãã±ãŒã·ã§ã³ã䜿çšãããã顧客ã«è«æ±å äœæãå°ããŸãã
- VATçšçãç¹å®ããïŒé¡§å®¢ã®åœã®VATçšçã調ã¹ãŸããVATçšçã¯åœã«ãã£ãŠç°ãªããŸãã
- VATãé©çšããïŒVATé¡ãèšç®ãã補åäŸ¡æ Œã«è¿œå ããŸãã
- VATã城åãééããïŒé¡§å®¢ããVATã城åããé¢é£ããçšååœå±ã«ééããŸãã
- VATå ±åïŒVATç³åæžã«åŸŽåãããVATãå ±åããçŸå°ã®èŠä»¶ãéµå®ããŸãã
ããã¯ãããŒã¿æ€çŽ¢ïŒäŸïŒVATçšçã®ããŒã¿ããŒã¹ããïŒãšèšç®ããžãã¯ã®çµã¿åããã䜿çšããŠPythonã§å®è£ ã§ããŸãã
çµè«
PythonããŒã¹ã®çšéèšç®ãšã³ãžã³ã®æ§ç¯ã¯è€éãªåãçµã¿ã§ãããå¹çæ§ãæ£ç¢ºæ§ãããã³ã³ã³ãã©ã€ã¢ã³ã¹ã®ç¹ã§å€§ããªã¡ãªããããããããŸãããã®èšäºã§æŠèª¬ããèšèšååãšå®è£ æŠç¥ã«åŸãããšã§ãäŒæ¥ã¯ç¹å®ã®ããŒãºãæºããå ç¢ã§é©å¿æ§ã®é«ããœãªã¥ãŒã·ã§ã³ãäœæã§ããŸããçšéèšç®ãšã³ãžã³ã®é·æçãªæåã確å®ã«ããããã«ãæè»æ§ãä¿å®æ§ãããã³åŸ¹åºçãªãã¹ããåªå ããããšãå¿ããªãã§ãã ãããããã«ãçµ¶ããå€åããäžçã®ç¶æ³ã«ãããŠã眰åãåé¿ãã³ã³ãã©ã€ã¢ã³ã¹ãç¶æããããã«ã¯ãå€åããçšæ³ããã³èŠå¶ã®ç¶ç¶çãªç£èŠãäžå¯æ¬ ã§ãã